﻿using ctolua.Models.Areas;
using ctolua.Models.Enum;
using ctolua.Models.Type;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ctolua.Models
{
    public static class MEvent
    {
        public static string 选择单位事件(Action<MRole, MUnit> fun)
        {
            return GT.add_event2(TGlobalEventType.选择单位, (_, data) => {
                fun(MRole.get_role_by_id(data.data.__role_id),MUnit.obj(data.data.__unit_id));
            });
        }
        public static string 单位出生事件(Action<MUnit> fun)
        {
            return GT.add_event2(TUnitEventType.单位出生, (_, data) => {
                fun( MUnit.obj(data.data.__unit_id));
            });
        }
        public static string 单位死亡事件(Action<MUnit> fun)
        {
            return GT.add_event2(TUnitEventType.单位死亡, (_, data) => {
                fun(MUnit.obj(data.data.__unit_id));
            });
        }
        
        public static string 物品创建事件(Action<MItem> fun)
        {
            return GT.add_event2(TItemEventType.物品创建, (_, data) => {
                fun(MItem.obj((int)data.data.__item_id));
            });
        }
        public static string 单位获得物品(Action<MItem,MUnit> fun)
        {
            return GT.add_event2(TItemEventType.单位获得物品, (_, data) => {
                fun(MItem.obj((int)data.data.__item_id),MUnit.obj(data.data.__unit_id));
            });
        }
        
        public static string 单位失去物品(Action<MItem, MUnit> fun)
        {
            return GT.add_event2(TItemEventType.单位失去物品, (_, data) => {
                fun(MItem.obj((int)data.data.__item_id), MUnit.obj(data.data.__unit_id));
            });
        }
        public static string 玩家加入(Action<MRole, bool> fun)
        {
            return GT.add_event2(TGlobalEventType.玩家加入, (_, data) => {
                fun(MRole.get_role_by_id(data.data.__role_id), data.data.__is_middle_join);
            });
        }
        public static string 玩家退出(Action<MRole> fun)
        {
            return GT.add_event2(TGlobalEventType.玩家退出, (_, data) => {
                fun(MRole.get_role_by_id(data.data.__role_id));
            });
        }
        public static string 按键按下(EKeyboardKey key, Action<MRole> fun)
        {
            return GT.add_event(TGlobalEventType.按键按下, key, (_, data) => {
                fun(MRole.get_role_by_id(data.data.__role_id));
            });
        }
        /// <summary>
        /// 即将施法
        /// </summary>
        /// <param name="fun"> 施法技能 施法单位 技能选取单位 技能选取的破坏物 技能选取的物品 技能释放位置 </param>
        /// <returns></returns>
        public static string 即将施法( Action<MAbility,MUnit,MUnit,MDestructible,MItem,MPoint> fun)
        {
            return GT.add_event2(TAbilityEventType.即将施法, (_, data) => {
                MAbility a = MAbility.obj(data.data.__ability);
                int runtime_id = data.data.__ability_runtime_id;
                fun(a,MUnit.obj(data.data.__unit_id),MUnit.obj(a.get_target_unit(runtime_id)),MDestructible.obj(a.get_target_dest(runtime_id)),MItem.obj(a.get_target_item(runtime_id)), MPoint.obj(a.get_release_position(runtime_id)));
            });
        }
        /// <summary>
        /// 施法开始
        /// </summary>
        /// <param name="fun"> 施法技能 施法单位 技能选取单位 技能选取的破坏物 技能选取的物品 技能释放位置 </param>
        /// <returns></returns>
        public static string 施法开始(Action<MAbility, MUnit, MUnit, MDestructible, MItem, MPoint> fun)
        {
            return GT.add_event2(TAbilityEventType.施法开始, (_, data) => {
                MAbility a = MAbility.obj(data.data.__ability);
                int runtime_id = data.data.__ability_runtime_id;
                fun(a, MUnit.obj(data.data.__unit_id), MUnit.obj(a.get_target_unit(runtime_id)), MDestructible.obj(a.get_target_dest(runtime_id)), MItem.obj(a.get_target_item(runtime_id)), MPoint.obj(a.get_release_position(runtime_id)));
            });
        }
        /// <summary>
        /// 施法开始
        /// </summary>
        /// <param name="fun"> 施法技能 施法单位 技能选取单位 技能选取的破坏物 技能选取的物品 技能释放位置 </param>
        /// <returns></returns>
        public static string 施法引导(Action<MAbility, MUnit, MUnit, MDestructible, MItem, MPoint> fun)
        {
            return GT.add_event2(TAbilityEventType.施法引导, (_, data) => {
                MAbility a = MAbility.obj(data.data.__ability);
                int runtime_id = data.data.__ability_runtime_id;
                fun(a, MUnit.obj(data.data.__unit_id), MUnit.obj(a.get_target_unit(runtime_id)), MDestructible.obj(a.get_target_dest(runtime_id)), MItem.obj(a.get_target_item(runtime_id)), MPoint.obj(a.get_release_position(runtime_id)));
            });
        }
        /// <summary>
        /// 施法开始
        /// </summary>
        /// <param name="fun"> 施法技能 施法单位 技能选取单位 技能选取的破坏物 技能选取的物品 技能释放位置 </param>
        /// <returns></returns>
        public static string 施法出手(Action<MAbility, MUnit, MUnit, MDestructible, MItem, MPoint> fun)
        {
            return GT.add_event2(TAbilityEventType.施法出手, (_, data) => {
                MAbility a = MAbility.obj(data.data.__ability);
                int runtime_id = data.data.__ability_runtime_id;
                fun(a, MUnit.obj(data.data.__unit_id), MUnit.obj(a.get_target_unit(runtime_id)), MDestructible.obj(a.get_target_dest(runtime_id)), MItem.obj(a.get_target_item(runtime_id)), MPoint.obj(a.get_release_position(runtime_id)));
            });
        }
        /// <summary>
        /// 施法开始
        /// </summary>
        /// <param name="fun"> 施法技能 施法单位 技能选取单位 技能选取的破坏物 技能选取的物品 技能释放位置 </param>
        /// <returns></returns>
        public static string 施法完成(Action<MAbility, MUnit, MUnit, MDestructible, MItem, MPoint> fun)
        {
            return GT.add_event2(TAbilityEventType.施法完成, (_, data) => {
                MAbility a = MAbility.obj(data.data.__ability);
                int runtime_id = data.data.__ability_runtime_id;
                fun(a, MUnit.obj(data.data.__unit_id), MUnit.obj(a.get_target_unit(runtime_id)), MDestructible.obj(a.get_target_dest(runtime_id)), MItem.obj(a.get_target_item(runtime_id)), MPoint.obj(a.get_release_position(runtime_id)));
            });
        }
        /// <summary>
        /// 施法开始
        /// </summary>
        /// <param name="fun"> 施法技能 施法单位 技能选取单位 技能选取的破坏物 技能选取的物品 技能释放位置 </param>
        /// <returns></returns>
        public static string 后摇结束(Action<MAbility, MUnit, MUnit, MDestructible, MItem, MPoint> fun)
        {
            return GT.add_event2(TAbilityEventType.后摇结束, (_, data) => {
                MAbility a = MAbility.obj(data.data.__ability);
                int runtime_id = data.data.__ability_runtime_id;
                fun(a, MUnit.obj(data.data.__unit_id), MUnit.obj(a.get_target_unit(runtime_id)), MDestructible.obj(a.get_target_dest(runtime_id)), MItem.obj(a.get_target_item(runtime_id)), MPoint.obj(a.get_release_position(runtime_id)));
            });
        }
        /// <summary>
        /// 施法开始
        /// </summary>
        /// <param name="fun"> 施法技能 施法单位 技能选取单位 技能选取的破坏物 技能选取的物品 技能释放位置 </param>
        /// <returns></returns>
        public static string 施法停止(Action<MAbility, MUnit, MUnit, MDestructible, MItem, MPoint> fun)
        {
            return GT.add_event2(TAbilityEventType.施法停止, (_, data) => {
                MAbility a = MAbility.obj(data.data.__ability);
                int runtime_id = data.data.__ability_runtime_id;
                fun(a, MUnit.obj(data.data.__unit_id), MUnit.obj(a.get_target_unit(runtime_id)), MDestructible.obj(a.get_target_dest(runtime_id)), MItem.obj(a.get_target_item(runtime_id)), MPoint.obj(a.get_release_position(runtime_id)));
            });
        }
        /// <summary>
        /// 获得技能
        /// </summary>
        /// <param name="fun"> 获得的技能 获得的单位 </param>
        /// <returns></returns>
        public static string 获得技能(Action<MAbility, MUnit> fun)
        {
            return GT.add_event2(TAbilityEventType.获得技能, (_, data) => {
                fun(MAbility.obj(data.data.__ability), MUnit.obj(data.data.__unit_id));
            });
        }
        /// <summary>
        /// 失去技能
        /// </summary>
        /// <param name="fun"> 失去的技能 失去的单位 </param>
        /// <returns></returns>
        public static string 失去技能(Action<MAbility, MUnit> fun)
        {
            return GT.add_event2(TAbilityEventType.失去技能, (_, data) => {
                fun(MAbility.obj(data.data.__ability), MUnit.obj(data.data.__unit_id));
            });
        }
        /// <summary>
        /// 造成伤害_结算完成_任意单位
        /// </summary>
        /// <param name="fun"> 来源单位  触发单位 伤害 伤害类型 是否暴击 是否普攻 伤害技能</param>
        /// <returns></returns>
        public static string 造成伤害_结算完成_任意单位(Action<MUnit, MUnit,Fix32,int,bool,bool,MAbility> fun)
        {
            //"<var>" = {
            //    "data" = { '__source_unit': < LCreature(10000001) >, '__target_unit': < LCreature(1) >, '__damage_type': 0, '__ability': Ability < 999 >, '__is_normal_hit': True, 'critical': False, 'no_miss': False, '__damage': framecore.fixmath.Fix32([H]'-100'), 'damage_params': framecore.fixmath.Fix32([H]'-100'), '__jump_word_type': 8, '__forbid_critical_hit': True, '__damage_result_state': 1, 'hurt_coffcient': framecore.fixmath.Fix32([H]'1'), '__unit_id': 1, 'once_damage': framecore.fixmath.Fix32([H]'-100'), 'hp_vampire': framecore.fixmath.Fix32([H]'0'), 'hp_changed': framecore.fixmath.Fix32([H]'-100'), '__is_critical_hit': False}
            //}
            return GT.add_event2(TUnitEventType.造成伤害_结算完成_任意单位, (_, data) => {
                if (data.data.__ability==null)
                {
                    return;
                }
                Unit __source_unit = data.data.__source_unit;
                Unit __target_unit = data.data.__target_unit;
                fun(MUnit.obj(__source_unit), MUnit.obj(__target_unit), data.data.__damage, data.data.__damage_type, data.data.__is_critical_hit, data.data.__is_normal_hit,MAbility.obj(data.data.__ability));
            });
        }
        /// <summary>
        /// 选择单位组
        /// </summary>
        /// <param name="fun"> 触发玩家 选中的单位组 队伍id </param>
        /// <returns></returns>
        public static string 选择单位组(Action<MRole, MUnitGroup,int> fun)
        {
            return GT.add_event2(TGlobalEventType.选择单位组, (_, data) => {
                fun(MRole.get_role_by_id(data.data.__role_id), MUnitGroup.obj(data.data.__unit_group_id_list), data.data.__team_id);
            });
        }
        /// <summary>
        /// 区域离开
        /// </summary>
        /// <param name="fun"> 触发单位 触发区域id </param>
        /// <returns></returns>
        public static string 区域离开(MArea area,Action<MUnit, MArea> fun)
        {
            return GT.add_event3(TGlobalEventType.区域离开, (t, actor) => { return area.area; } ,(_, data) => {
                fun(MUnit.obj(data.data.__unit_id), area);
            });
        }
        /// <summary>
        /// 区域进入
        /// </summary>
        /// <param name="fun"> 触发单位 触发区域id </param>
        /// <returns></returns>
        public static string 区域进入(MArea area, Action<MUnit, MArea> fun)
        {
            return GT.add_event3(TGlobalEventType.区域进入, (t, actor) => { return area.area; }, (_, data) => {
                fun(MUnit.obj(data.data.__unit_id), area);
            });
        }
        /// <summary>
        /// 造成伤害_结算完成_指定单位
        /// </summary>
        /// <param name="fun"> 来源单位  触发单位 伤害 伤害类型 是否暴击 是否普攻 伤害技能</param>
        /// <returns></returns>
        public static string 造成伤害_结算完成_指定单位(MUnit u,Action<MUnit, MUnit, Fix32, int, bool, bool, MAbility> fun)
        {
            return GT.add_event3(TUnitEventType.造成伤害_结算完成_指定单位, (t,a) => { return u.unit; }, (_, data) => {
                fun(MUnit.obj(data.data.__source_unit), MUnit.obj(data.data.__target_unit), data.data.__damage, data.data.__damage_type, data.data.__is_critical_hit, data.data.__is_normal_hit, MAbility.obj(data.data.__ability));
            });
        }
        /// <summary>
        /// 获得魔法效果
        /// </summary>
        /// <param name="fun"> 触发单位 来源单位 魔法效果</param>
        /// <returns></returns>
        public static string 获得魔法效果( Action<MUnit, MUnit, MModifier> fun)
        {
            return GT.add_event2(TModifierEventType.获得魔法效果,  (_, data) => {
                fun(MUnit.obj((Unit)data.data.__owner_unit), MUnit.obj(data.data.__from_unit_id),
                MModifier.obj(data.data.__modifier));
            });
        }
        /// <summary>
        /// 失去魔法效果
        /// </summary>
        /// <param name="fun"> 触发单位 来源单位 魔法效果</param>
        /// <returns></returns>
        public static string 失去魔法效果( Action<MUnit, MUnit, MModifier> fun)
        {
            return GT.add_event2(TModifierEventType.失去魔法效果, (_, data) => {
                fun(MUnit.obj((Unit)data.data.__owner_unit), MUnit.obj(data.data.__from_unit_id),
                MModifier.obj(data.data.__modifier));
            });
        }
        /// <summary>
        /// 循环触发魔法效果
        /// </summary>
        /// <param name="fun"> 触发单位 来源单位 魔法效果</param>
        /// <returns></returns>
        public static string 循环触发魔法效果( Action<MUnit, MUnit, MModifier> fun)
        {
            return GT.add_event2(TModifierEventType.循环触发, (_, data) => {
                fun(MUnit.obj((Unit)data.data.__owner_unit), MUnit.obj(data.data.__from_unit_id),
                MModifier.obj(data.data.__modifier));
            });
        }
        /// <summary>
        /// 层数变化魔法效果
        /// </summary>
        /// <param name="fun"> 触发单位 来源单位 魔法效果</param>
        /// <returns></returns>
        public static string 层数变化魔法效果( Action<MUnit, MUnit, MModifier,int> fun)
        {
            return GT.add_event2(TModifierEventType.层数变化, (_, data) => {
                fun(MUnit.obj((Unit)data.data.__owner_unit), MUnit.obj(data.data.__from_unit_id),
                MModifier.obj(data.data.__modifier), data.data.__layer_change_values);
            });
        }
        /// <summary>
        /// 叠加魔法效果
        /// </summary>
        /// <param name="fun"> 触发单位 来源单位 魔法效果</param>
        /// <returns></returns>
        public static string 叠加魔法效果( Action<MUnit, MUnit, MModifier,int> fun)
        {
            return GT.add_event2(TModifierEventType.叠加, (_, data) => {
                fun(MUnit.obj((Unit)data.data.__owner_unit), MUnit.obj(data.data.__from_unit_id),
                MModifier.obj(data.data.__modifier), data.data.__layer_change_values);
            });
        }
    }
}
